package jvm.VMExecSubsystem;

/**
 * 字段不参与多态
 * @author msi
 */
public class FieldHasNoPolymorphic {

    static class Father {
        public int money = 1;

        public Father() {
            money = 2;
            showMeTheMoney();
        }

        public void showMeTheMoney() {
            System.out.println("I am Father, i have $" + money);
        }
    }

    static class Son extends Father {
        public int money = 3;

        public Son() {
            money = 4;
            showMeTheMoney();
        }

        public void showMeTheMoney() {
            System.out.println("I am Son,  i have $" + money);
        }
    }

    public static void main(String[] args) {
        Father gay = new Son();
        System.out.println("This gay has $" + gay.money);
    }
}

/**
 * 结果：
 *  I am Son,  i have $0
 *  I am Son,  i have $4
 *  This gay has $2
 *  解释： 1. new Son的时候会先调用父类构造器， 由于 父类构造器中调用了 showMeTheMoney()方法，这是个虚方法，使用 invokevirtual指令调用，这个指令则会根据实际类型也就是 Son 类型查找这个方法，所以调用的是子类的方法。
 *          但是由于这时子类字段money(字段不参与多态)还没有赋值，所以是0。
 *        2. 这调用的就是子类的构造器了，也适合1类似的逻辑，通过 invokevirtual 查找实际类型，匹配上实际方法版本。
 *        3. 通过静态类型访问到了父类中的money。
 */